package saei.bean;

import javax.persistence.*;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.ForeignKey;
import org.hibernate.annotations.Index;

import saei.bean.parametros.MarcaEquipo;
import saei.bean.parametros.Parametro;
import saei.bean.vo.EquipoVO;
import saei.service.ServiciosEstado;

@SuppressWarnings("serial")
@Entity
@Table(name="Equipo")
@Inheritance(strategy= InheritanceType.JOINED)
public abstract class Equipo extends EntidadPersistente
{
    @Column(name="num_serie", unique=true)
    @Index(name="uk_equipo")
    private String numeroSerie;
    @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
	@Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
    @ForeignKey(name="fk_equipo_marca")
    @JoinColumn(name="id_marca")
    private MarcaEquipo marca;
    @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
	@Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
    @ForeignKey(name="fk_equipo_modelo")
    @JoinColumn(name="id_modelo")
    private Parametro modelo;
    @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
	@Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
    @ForeignKey(name="fk_equipo_remito")
    @JoinColumn(name="id_remito")
    private Remito remito;
    @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
	@Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
    @ForeignKey(name="fk_equipo_estado")
    @JoinColumn(name="id_estado")
    private Estado estado;
    @Column(name="observacion")
    private String observaciones;
    
    public Equipo () {}
    
    public Equipo (String numeroSerie){
    	this();
    	this.estado = ServiciosEstado.EstadoSinAsignar();
    	this.numeroSerie = numeroSerie;
    }
    
    public Equipo(String numeroSerie, MarcaEquipo marca, Parametro modelo, Remito remito, String observaciones) {
    	this(numeroSerie);
    	this.marca = marca;
    	this.modelo = modelo;
    	this.remito = remito;
    	this.observaciones = observaciones;
    }

	public MarcaEquipo getMarca() {
		return marca;
	}
	
	public void setMarca(MarcaEquipo marca) {		
		this.marca = marca;
	}
	
	public Parametro getModelo() {
		return modelo;
	}
	
	public void setModelo(Parametro modelo) {	
		this.modelo = modelo;
	}
	
	public String getNumeroSerie() {
		return numeroSerie;
	}
	
	public void setNumeroSerie(String numeroSerie) {
		this.numeroSerie = numeroSerie;
	}
	
	public Remito getRemito() {
		return remito;
	}
	
	public void setRemito(Remito remito) {
		this.remito = remito;
	}
	
	public Estado getEstado() {
		return estado;
	}
	
	public void setEstado(Estado estado) {
		this.estado = estado;
	}

	public String getObservaciones() {
		return observaciones;
	}

	public void setObservaciones(String observaciones) {
		this.observaciones = observaciones;
	}
    
	public String toString() {
		return "Equipo tipo: " + this.getClass().getSimpleName() + " - Numero de serie: " + this.getNumeroSerie();
	}
	
	public EquipoVO getVO() {
		EquipoVO vo = new EquipoVO();
		vo.setEstado(estado.getDescripcion());
		vo.setMarca(marca.getDescripcion());
		vo.setModelo(modelo.getDescripcion());
		vo.setNumeroSerie(numeroSerie);
		vo.setObservaciones(observaciones);
		
		return vo;
	}
}